home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-3303 / pcsclick / pcsclick.s < prev   
Text File  |  1985-11-19  |  16KB  |  778 lines

  1. ;FORCE_FILENAME
  2.  
  3. *-----------------------------------------------------------------------*
  4. *    USEFUL EQUATES                                    *
  5. *-----------------------------------------------------------------------*
  6.  
  7. MFP            =    $FFFFFA00
  8. ENABLE_A        =    MFP+$07        ; int enable A
  9. ENABLE_B        =    MFP+$09        ; int enable B
  10. PENDING_A        =    MFP+$0B        ; int pending A
  11. PENDING_B        =    MFP+$0D        ; int pending B
  12. IN_SERVICE_A    =    MFP+$0F        ; int in-service A
  13. IN_SERVICE_B    =    MFP+$11        ; int in-service B
  14. MASK_A        =    MFP+$13        ; int mask A
  15. MASK_B        =    MFP+$15        ; int mask B
  16. VECTOR        =    MFP+$17        ; MFP vector base
  17. CTRL_A        =    MFP+$19        ; MFP timer A control
  18. CTRL_B        =    MFP+$1B        ; MFP timer B control
  19. DATA_A        =    MFP+$1F        ; timer A data
  20. DATA_B        =    MFP+$21        ; timer B data
  21.  
  22. HBI_VEC        =    $68            ; Hblank timer
  23. VBI_VEC        =    $70            ; VBI
  24. KBD_VEC        =    $118            ; IKBD
  25. TIMER_A        =    $134            ; General timer
  26. TIMER_B        =    $120            ; Raster timer
  27.  
  28. LineADD        =    160
  29. PHYS_MED        =    $FFFF8201
  30. PHYS_TOP        =    $FFFF8203
  31. COLOUR        =    $FFFF8240
  32. FREQ            =    $FFFF820A
  33.  
  34. *-----------------------------------------------------------------------*
  35. *    USEFUL MACROS                                    *
  36. *-----------------------------------------------------------------------*
  37.  
  38. push    macro
  39.     move.\0    \1,-(sp)
  40.     endm
  41.     
  42. pop    macro
  43.     move.\0    (sp)+,\1
  44.     endm
  45.  
  46. pushall        macro
  47.     movem.l    d0-d7/a0-a6,-(sp)
  48.     endm
  49.     
  50. popall        macro
  51.     movem.l    (sp)+,d0-d7/a0-a6
  52.     endm
  53.  
  54. delay    macro                    ; wait for #n VBI's
  55.     move.w    #\1,TIMER
  56. .wz\@    tst.w        TIMER
  57.     bne.s        .wz\@
  58.     endm
  59.  
  60.  
  61. sendkey        macro
  62.     pea        \2
  63.     push.w    #\1-1
  64.     push.w    #25
  65.     trap        #14
  66.     addq        #8,sp
  67.     endm
  68.  
  69. sync    macro
  70.     IFEQ        NARG-1
  71.     dcb.w        \1,$4E71
  72.     ELSEIF
  73.     IFLT        \1-3-3
  74.     dcb.w        \1,$4E71
  75.     ELSEIF
  76.     move.w    #(\1-3)/3-1,\2
  77. .wc\@    dbra        \2,.wc\@
  78. Calc    set        (\1-3)-((\1-3)/3)*3
  79.     IFGT        Calc
  80.     dcb.w        Calc,$4E71
  81.     ENDC
  82.     ENDC
  83.     ENDC
  84.     endm
  85.  
  86. *-----------------------------------------------------------------------*
  87. *    Main display routine                                *
  88. *-----------------------------------------------------------------------*
  89.  
  90.     bsr        COMMAND                ; get TTP command line
  91.  
  92.     clr.l        -(sp)                    ; go into
  93.     move.w    #$20,-(sp)                ; supervisor mode.
  94.     trap        #1                    ;
  95.     addq.w    #6,sp
  96.     move.l    d0,-(sp)                ; keep old stack
  97.  
  98.     sendkey    1,MOUSE_OFF
  99.     sendkey    2,MOUSEBUTTON_KEY
  100.  
  101.     move.l    #(SCREEN1+255),d0
  102.     clr.b        d0
  103.     move.l    d0,PHYS_BITMAP
  104.     move.l    #(SCREEN2+255),d0
  105.     clr.b        d0
  106.     move.l    d0,LOG_BITMAP
  107.     move.l    #PALETTE1,PHYS_PALETTE
  108.     move.l    #PALETTE2,LOG_PALETTE
  109.  
  110.     bsr        EMPTY_BUFFER            ; clear keyboard buffer
  111.     bsr        LOAD_PCS                ; find and load file
  112.  
  113.     sendkey    1,MOUSE_REL
  114.  
  115.     bsr        DISPLAY_PCS                ; show off fancy piccy
  116.  
  117. EXIT:    bsr        EMPTY_BUFFER            ; clear keyboard again
  118.     sendkey    2,MOUSEBUTTON_MOUSE
  119.     bsr        EMPTY_BUFFER            ; clear keyboard again
  120.     sendkey    1,MOUSE_REL
  121.     clr.w        -(sp)
  122.     move        #11,-(sp)
  123.     trap        #13
  124.     addq.l    #4,sp
  125.     move.w    #$20,-(sp)                ; back to
  126.     trap        #1                    ; user mode.
  127.     addq.w    #6,sp
  128.     pea        $4C0000                ; now quit
  129.     trap        #1                    ; to desktop
  130.  
  131. MOUSEBUTTON_KEY:
  132.     dc.b        7,%100
  133. MOUSEBUTTON_MOUSE:
  134.     dc.b        7,%000
  135. MOUSE_REL:
  136.     dc.b        8
  137. MOUSE_ABS:
  138.     dc.b        9,0,100,0,100
  139. MOUSE_OFF:
  140.     dc.b        $12
  141. MOUSE_RESET:
  142.     dc.b        $80,1
  143.     even
  144.  
  145. COMMAND:
  146.     lea        MODCOM,a0
  147.     move.l    8(sp),(a0)
  148.     add.l        #$81,(a0)
  149.     rts
  150.     
  151. LOAD_PCS:
  152.     move.l    #space,PIC_PTR
  153.     IFND        FORCE_FILENAME
  154.     lea        FILENAME,a0
  155.     move.l    MODCOM,a1        ; insert name from command line
  156.     move.w    #32-1,d0
  157. .f    move.b    (a1)+,(a0)+
  158.     dbra        d0,.f
  159.     ENDC
  160. .cont    clr.w        -(sp)
  161.     pea        FILENAME
  162.     push.w    #61        ; open
  163.     trap        #1
  164.     addq        #8,sp
  165.     tst.w        d0
  166.     bmi        .err
  167.     move.w    d0,HANDLE
  168.     push.l    PIC_PTR
  169.     push.l    #102000
  170.     push.w    HANDLE
  171.     push.w    #63
  172.     trap        #1
  173.     add.w        #12,sp
  174.     add.l        PIC_PTR,d0
  175.     add.l        #4,d0
  176.     and.b        #-2,d0
  177.     move.l    d0,BANK_PTR
  178.     push.w    HANDLE
  179.     push.w    #62
  180.     trap        #1
  181.     addq        #4,sp
  182.     move.l    PIC_PTR,a0
  183.     cmp.l        #"ICE!",(a0)
  184.     bne.s        .exit
  185.     move.l    BANK_PTR,a1
  186.     move.l    a1,PIC_PTR
  187.     bsr        DECRUNCH
  188. .exit    rts
  189. .err    addq        #4,sp
  190.     bra        EXIT
  191.     
  192. *-----------------------------------------------------------------------*
  193. *    DISPLAY 'PCS' ROUTINES START HERE                        *
  194. *-----------------------------------------------------------------------*
  195.  
  196. DISPLAY_PCS:                ; show one of my own snazzy 'PCS' pics.
  197.     bsr        SAVE_SCREEN_SETUP    ; init screen for piccy, saving old one
  198.     bsr        INIT_VECTORS    ; store old vector setup
  199.     move.l    PIC_PTR,a0        ; get address of file
  200.     bsr        UNPACK_PCS        ; unpack picture onto screen(s).
  201.     delay        5            ; wait for 10 vbi's (in case of 50/60Hz
  202.     bsr        ENHANCED_DISPLAY    ; switch). Turn on display interrupt.
  203.     move.w    TIME,d1
  204.     mulu        #50,d1
  205.     subq.l    #1,d1
  206. .loop    bsr        GET_CODE
  207.     cmp.b        #57,d0
  208.     bne.s        .nsp
  209. .wt2    bsr        GET_CODE
  210.     bpl.s        .wt2
  211.     cmp.w        #57+128,d0
  212.     bne.s        .wt2
  213.     bra.s        .out
  214. .nsp    cmp.b        #117,d0
  215.     bne.s        .none
  216. .wt    bsr        GET_CODE
  217.     bpl.s        .wt
  218.     cmp.w        #117+128,d0
  219.     bne.s        .wt
  220.     bra.s        .out
  221. .none    addq        #1,TIMER        ; wait for 1 VBI
  222. .wtv    tst.w        TIMER
  223.     bne.s        .wtv
  224.     subq.l    #1,d1            ; decrement wait-counter.
  225.     bpl.s        .loop
  226. .out    bsr        STANDARD_DISPLAY    ; when done, remove display interrupt.
  227.     bsr        KILL_PALETTE
  228.     bsr        RESET_VECTORS    ; reset system stuff
  229.     bsr        REPLACE_SCREEN_SETUP
  230.     rts
  231.  
  232. GET_CODE:
  233.     moveq        #0,d0
  234.     move.b    IKBD_DATA.w,d0
  235.     tst.b        d0
  236.     rts
  237.  
  238. SAVE_SCREEN_SETUP:
  239.     lea        COLOUR.w,a0        ; store old colours
  240.     lea        OLD_PAL,a1
  241.     moveq        #8-1,d0
  242. .lp    move.l    (a0)+,(a1)+
  243.     dbra        d0,.lp
  244.     move.w    #4,-(sp)    ; store old res
  245.     trap        #14
  246.     addq        #2,sp
  247.     move.w    d0,OLD_RES
  248.     move.w    #2,-(sp)    ; store old screen address
  249.     trap        #14
  250.     addq        #2,sp
  251.     move.l    d0,OLD_SCR
  252.     push.w    #37
  253.     trap        #14
  254.     addq        #2,sp
  255.     push.w    #0
  256.     pea        -1.w
  257.     pea        -1.w
  258.     push.w    #5
  259.     trap        #14
  260.     add.w        #12,sp
  261.     bsr        KILL_PALETTE    ; black screen
  262.     move.l    PHYS_BITMAP,a0        ; clear screen 1
  263.     bsr        CLS
  264.     move.l    LOG_BITMAP,a0        ; clear screen 2
  265.     bsr        CLS    
  266.     rts
  267.     
  268. REPLACE_SCREEN_SETUP:
  269.     bsr        KILL_PALETTE    ; black screen
  270.     move.l    PHYS_BITMAP,a0        ; clear screen 1
  271.     bsr        CLS
  272.     move.l    LOG_BITMAP,a0        ; clear screen 2
  273.     bsr        CLS    
  274.     push.w    #37
  275.     trap        #14
  276.     addq        #2,sp
  277.     push.w    OLD_RES
  278.     push.l    OLD_SCR
  279.     push.l    OLD_SCR
  280.     push.w    #5
  281.     trap        #14
  282.     add.w        #12,sp
  283.     lea        OLD_PAL,a0
  284.     lea        COLOUR.w,a1        ; store old colours
  285.     moveq        #8-1,d0
  286. .lp    move.l    (a0)+,(a1)+
  287.     dbra        d0,.lp
  288.     rts
  289.  
  290. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  291. *    UNPACK A 'PCS' PICTURE                                *
  292. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  293.  
  294.             rsreset
  295. PCS_width        rs.w    1    ; usually 320 for now
  296. PCS_height        rs.w    1    ; usually 200 for now
  297. PCS_interlace    rs.b    1    ; PCS-ST/E = 0 : SuperHam and Pchrome <> 0
  298. PCS_ste        rs.b    1    ; uses ste palette? 50/60Hz?
  299. PCS_start        rs.b    0    ; end of file header
  300.  
  301. UNPACK_PCS:
  302.     clr.b        HERZ
  303.     clr.b        INTERLACE
  304.     lea        PCS_start(a0),a1
  305.     move.l    a0,a6
  306.     btst.b    #0,PCS_ste(a6)
  307.     beq.s        .hz60
  308. .hz50    move.b    #2,HERZ
  309. .hz60    move.b    HERZ,FREQ.w
  310.     move.l    PHYS_BITMAP,a0
  311.     bsr.s        UNPACK_BITMAP
  312.     move.l    PHYS_PALETTE,a0
  313.     bsr        UNPACK_PALETTE
  314.     tst.b        PCS_interlace(a6)
  315.     beq.s        .done
  316.     st        INTERLACE
  317.     move.l    LOG_BITMAP,a0
  318.     bsr.s        UNPACK_BITMAP
  319.     move.l    LOG_PALETTE,a0
  320.     bsr        UNPACK_PALETTE
  321.     bsr        XOR_BITMAP
  322.     bsr        XOR_PALETTE
  323. .done    rts
  324.     
  325. UNPACK_BITMAP:                ; decompress a bitmap.
  326.     moveq        #0,d6
  327.     move.w    #40,d2
  328.     move.w    #200,d3
  329.     moveq        #5,d4
  330.     move.b    (a1)+,d7
  331.     lsl.w        #8,d7
  332.     move.b    (a1)+,d7
  333. .Main    moveq        #0,d0
  334.     subq        #1,d7
  335.     bmi.s        .esc
  336.     move.b    (a1)+,d0
  337.     bmi.s        .B_block_copy
  338.     beq.s        .W_run_length
  339.     cmp.b        #1,d0
  340.     beq.s        .W_block_copy
  341.     bra.s        .B_run_length
  342. .W_run_length
  343.     move.b    (a1)+,d0
  344.     lsl.w        #8,d0
  345.     move.b    (a1)+,d0
  346. .B_run_length
  347.     subq        #1,d0
  348.     move.b    (a1)+,d1
  349. .run    move.b    d1,(a0,d6)
  350.     addq        #1,d6
  351.     and.w        #1,d6
  352.     bne.s        .ok
  353.     addq        #8,a0
  354. .ok    subq        #1,d2                ; drop 1 line
  355.     bne.s        .fine
  356.     moveq        #40,d2
  357.     subq        #1,d3
  358.     bne.s        .fine
  359.     move.w    #200,d3
  360.     lea        2-32000(a0),a0
  361.     subq        #1,d4
  362.     beq.s        .esc
  363. .fine    dbra        d0,.run
  364.     bra.s        .Main
  365. .esc    rts
  366. .B_block_copy
  367.     neg.b        d0
  368.     bra.s        .nw
  369. .W_block_copy
  370.     move.b    (a1)+,d0
  371.     lsl.w        #8,d0
  372.     move.b    (a1)+,d0
  373. .nw    subq        #1,d0
  374. .blk    move.b    (a1)+,d1
  375.     move.b    d1,(a0,d6)
  376.     addq        #1,d6
  377.     and.w        #1,d6
  378.     bne.s        .ok2
  379.     addq        #8,a0
  380. .ok2    subq        #1,d2                ; drop 1 line
  381.     bne.s        .fin2
  382.     moveq        #40,d2
  383.     subq        #1,d3
  384.     bne.s        .fin2
  385.     move.w    #200,d3
  386.     lea        2-32000(a0),a0
  387.     subq        #1,d4
  388.     beq.s        .esc
  389. .fin2    dbra        d0,.blk
  390.     bra        .Main
  391.  
  392. UNPACK_PALETTE:                ; decompress a palette
  393.     move.b    (a1)+,d7
  394.     lsl.w        #8,d7
  395.     move.b    (a1)+,d7
  396. .Main    moveq        #0,d0
  397.     subq        #1,d7
  398.     bmi.s        .esc
  399.     move.b    (a1)+,d0
  400.     bmi.s        .B_block_copy
  401.     beq.s        .W_run_length
  402.     cmp.b        #1,d0
  403.     beq.s        .W_block_copy
  404.     bra.s        .B_run_length
  405. .W_run_length
  406.     move.b    (a1)+,d0
  407.     lsl.w        #8,d0
  408.     move.b    (a1)+,d0
  409. .B_run_length
  410.     subq        #1,d0
  411.     move.b    (a1)+,d1
  412.     lsl.w        #8,d1
  413.     move.b    (a1)+,d1
  414. .run    move.w    d1,(a0)+
  415.     dbra        d0,.run
  416.     bra.s        .Main
  417. .esc    rts
  418. .B_block_copy
  419.     neg.b        d0
  420.     bra.s        .nw
  421. .W_block_copy
  422.     move.b    (a1)+,d0
  423.     lsl.w        #8,d0
  424.     move.b    (a1)+,d0
  425. .nw    subq        #1,d0
  426. .blk    move.b    (a1)+,d1
  427.     lsl.w        #8,d1
  428.     move.b    (a1)+,d1
  429.     move.w    d1,(a0)+
  430.     dbra        d0,.blk
  431.     bra.s        .Main
  432.  
  433. XOR_BITMAP:                        ; delta decompression on bitmap.
  434.     btst.b    #0,PCS_interlace(a6)
  435.     bne.s        .nox
  436.     pushall
  437.     move.l    PHYS_BITMAP,a0
  438.     move.l    LOG_BITMAP,a1
  439.     move.w    #32000/4-1,d0
  440. .blop    move.l    (a0)+,d1
  441.     eor.l        d1,(a1)+
  442.     dbra        d0,.blop
  443.     popall
  444. .nox    rts
  445.  
  446. XOR_PALETTE:                        ; delta decompression on palette.
  447.     btst.b    #1,PCS_interlace(a6)
  448.     bne.s        .nox
  449.     pushall
  450.     move.l    PHYS_PALETTE,a0
  451.     move.l    LOG_PALETTE,a1
  452.     move.w    #16*(3*199+1)-1,d0
  453. .clop    move.w    (a0)+,d1
  454.     eor.w        d1,(a1)+
  455.     dbra        d0,.clop
  456.     popall
  457. .nox    rts
  458.  
  459. *-----------------------------------------------------------------------*
  460. *    COLOUR SWITCHING ROUTINE                            *
  461. *-----------------------------------------------------------------------*
  462. *    This is the actual screen-display interrupt and setup code        *
  463. *-----------------------------------------------------------------------*
  464.  
  465. VIDEO_COUNTER    =    $FFFF8209
  466. PHYSBASE        =    $FFFF8200
  467. IKBD_CTRL        =    $FFFFFC00
  468. IKBD_DATA        =    $FFFFFC02
  469.  
  470. PhotoChrome:
  471.     pushall
  472.     btst        #1,FREQ.w
  473.     bne.s        .hz50
  474.     move.b    #32-10,SCANLINE
  475. .hz60    move.l    #SCAN_COUNTER_60HZ,HBI_VEC.w
  476.     bra.s        .done
  477. .hz50    move.b    #62-10,SCANLINE
  478.     move.l    #SCAN_COUNTER_50HZ,HBI_VEC.w
  479. .done    move.w    #$2100,sr
  480.     move.l    PHYS_BITMAP,d0
  481.     lsr.w        #8,d0
  482.     move.l    d0,PHYSBASE.w
  483.     tst.b        INTERLACE
  484.     beq.s        .scrn
  485.     move.l    PHYS_BITMAP,d0
  486.     move.l    LOG_BITMAP,PHYS_BITMAP
  487.     move.l    d0,LOG_BITMAP
  488.     move.l    LOG_PALETTE,d0
  489.     move.l    PHYS_PALETTE,LOG_PALETTE
  490.     move.l    d0,PHYS_PALETTE
  491. .scrn    move.l    PHYS_PALETTE,a0
  492.     addq        #2,a0
  493.     lea        2+COLOUR.w,a1
  494.     move.w    (a0)+,(a1)+
  495.     move.l    (a0)+,(a1)+
  496.     move.l    (a0)+,(a1)+
  497.     move.l    (a0)+,(a1)+
  498.     move.l    (a0)+,(a1)+
  499.     move.l    (a0)+,(a1)+
  500.     move.l    (a0)+,(a1)+
  501.     move.l    (a0)+,(a1)+
  502.     lea        SCANLINE,a0
  503. .wait    tst.b        (a0)
  504.     bne.s        .wait
  505.     move.w    #$2300,sr
  506. .read    btst        #0,IKBD_CTRL.w
  507.     beq.s        .out
  508.     move.b    IKBD_DATA.w,d0
  509.     bra.s        .read
  510. .out    lea        TIMER,a0
  511.     tst.w        (a0)
  512.     ble.s        .zero
  513.     subq        #1,(a0)
  514. .zero    popall
  515.     rte
  516.  
  517. SCANLINE:        ds.w    1
  518.  
  519. SCAN_COUNTER_50HZ:
  520.     subq.b    #1,SCANLINE
  521.     ble.s        SCREEN_RASTER_50HZ
  522.     rte
  523.     
  524. SCREEN_RASTER_50HZ:
  525.     move.w    #$2700,sr
  526.     lea        (.ssp)+2,a6
  527.     move.l    a7,(a6)
  528.     lea        VIDEO_COUNTER.w,a6
  529.     moveq        #0,d0
  530.     moveq        #64,d7
  531. .wait    move.b    (a6),d0
  532.     beq.s        .wait
  533.     sub.w        d0,d7
  534.     lsl.w        d7,d0
  535.     move.l    PHYS_PALETTE(pc),a7
  536.     lea        32(a7),a7
  537.     sync        53,d0
  538.     rept        199
  539.     movem.l    (a7)+,d0-a6
  540.     movem.l    d0-d7,COLOUR.w
  541.     movem.l    a0-a6,COLOUR.w
  542.     move.l    (a7)+,28+COLOUR.w
  543.     lea        COLOUR.w,a0
  544.     move.l    (a7)+,(a0)+
  545.     move.l    (a7)+,(a0)+
  546.     move.l    (a7)+,(a0)+
  547.     move.l    (a7)+,(a0)+
  548.     move.l    (a7)+,(a0)+
  549.     move.l    (a7)+,(a0)+
  550.     move.l    (a7)+,(a0)+
  551.     move.w    #0,COLOUR.w
  552.     move.l    (a7)+,(a0)+
  553.     nop
  554.     nop
  555.     nop
  556.     nop
  557.     nop
  558.     nop
  559.     nop
  560.     endr
  561. .ssp    move.l    #0,a7
  562.     pea        ARTE
  563.     pop.l        HBI_VEC.w    
  564.     move.b    #$23,(sp)
  565. ARTE:    rte
  566.  
  567. SCAN_COUNTER_60HZ:
  568.     subq.b    #1,SCANLINE
  569.     ble.s        SCREEN_RASTER_60HZ
  570.     rte
  571.     
  572. SCREEN_RASTER_60HZ:
  573.     move.w    #$2700,sr
  574.     lea        (.ssp)+2,a6
  575.     move.l    a7,(a6)
  576.     lea        VIDEO_COUNTER.w,a6
  577.     moveq        #0,d0
  578.     moveq        #64,d7
  579. .wait    move.b    (a6),d0
  580.     beq.s        .wait
  581.     sub.w        d0,d7
  582.     lsl.w        d7,d0
  583.     move.l    PHYS_PALETTE(pc),a7    
  584.     lea        32(a7),a7
  585.     sync        52,d0
  586.     rept        199
  587.     movem.l    (a7)+,d0-a6
  588.     movem.l    d0-d7,COLOUR.w
  589.     movem.l    a0-a6,COLOUR.w
  590.     move.l    (a7)+,28+COLOUR.w
  591.     lea        COLOUR.w,a0
  592.     move.l    (a7)+,(a0)+
  593.     move.l    (a7)+,(a0)+
  594.     move.l    (a7)+,(a0)+
  595.     move.l    (a7)+,(a0)+
  596.     move.l    (a7)+,(a0)+
  597.     move.l    (a7)+,(a0)+
  598.     move.l    (a7)+,(a0)+
  599.     move.w    #0,COLOUR.w
  600.     move.l    (a7)+,(a0)+
  601.     nop
  602.     nop
  603.     nop
  604.     nop
  605.     nop
  606.     nop
  607.     endr
  608. .ssp    move.l    #0,a7
  609.     pea        ARTE
  610.     pop.l        HBI_VEC.w    
  611.     move.b    #$23,(sp)
  612.     rte
  613.     
  614. *-----------------------------------------------------------------------*
  615. *    INITIALISE PCS DISPLAY INTERRUPT                        *
  616. *-----------------------------------------------------------------------*
  617.  
  618. ENHANCED_DISPLAY:
  619.     move.w    #$2700,sr
  620.     move.l    LOG_BITMAP,d0
  621.     lsr.w        #8,d0
  622.     move.l    d0,PHYSBASE.w
  623.     pea        PhotoChrome
  624.     pop.l        VBI_VEC.w
  625.     move.w    #$2300,sr
  626.     rts
  627.  
  628. STANDARD_DISPLAY:
  629.     move.w    #$2700,sr
  630.     pea        NEW_VBI
  631.     pop.l        VBI_VEC.w
  632.     move.w    #$2300,sr
  633.     rts
  634.  
  635. *-------------------------------------------------------------------------*
  636.  
  637. INIT_VECTORS:
  638.     lea        VECTORS,a0
  639.     move.l    USP,a1
  640.     move.l    a1,(a0)+
  641.     move.l    HBI_VEC.w,(a0)+
  642.     move.l    VBI_VEC.w,(a0)+
  643.     move.l    KBD_VEC.w,(a0)+
  644.     move.l    TIMER_A.w,(a0)+
  645.     move.l    TIMER_B.w,(a0)+
  646.     move.b    ENABLE_A.w,(a0)+
  647.     move.b    ENABLE_B.w,(a0)+
  648.     move.b    MASK_A.w,(a0)+
  649.     move.b    MASK_B.w,(a0)+
  650.     move.b    DATA_A.w,(a0)+
  651.     move.b    DATA_B.w,(a0)+
  652.     move.b    CTRL_A.w,(a0)+
  653.     move.b    CTRL_B.w,(a0)+
  654.     move.b    VECTOR.w,(a0)+
  655.     move.b    FREQ.w,(a0)+
  656.     move.w    #$2700,sr
  657.     pea        NEW_VBI
  658.     pop.l        VBI_VEC.w
  659.     move.b    #0,ENABLE_A.w
  660.     move.b    #1<<6,ENABLE_B.w    ; leave IKBD alone
  661.     move.w    #$2300,sr
  662.     rts
  663.     
  664. RESET_VECTORS:
  665.     move.w    #$2700,sr
  666.     lea        VECTORS,a0
  667.     move.l    (a0)+,a1
  668.     move.l    a1,USP
  669.     move.l    (a0)+,HBI_VEC.w
  670.     move.l    (a0)+,VBI_VEC.w
  671.     move.l    (a0)+,KBD_VEC.w
  672.     move.l    (a0)+,TIMER_A.w
  673.     move.l    (a0)+,TIMER_B.w
  674.     move.b    (a0)+,ENABLE_A.w
  675.     move.b    (a0)+,ENABLE_B.w
  676.     move.b    (a0)+,MASK_A.w
  677.     move.b    (a0)+,MASK_B.w
  678.     move.b    (a0)+,DATA_A.w
  679.     move.b    (a0)+,DATA_B.w
  680.     move.b    (a0)+,CTRL_A.w
  681.     move.b    (a0)+,CTRL_B.w
  682.     move.b    (a0)+,VECTOR.w
  683.     move.b    (a0)+,FREQ.w
  684.     move.w    #$2300,sr
  685.     rts
  686.  
  687. NEW_VBI:
  688.     push.l    a0
  689.     lea        TIMER,a0
  690.     tst.w        (a0)
  691.     ble.s        .rte
  692.     subq        #1,(a0)
  693. .rte    pop.l        a0
  694.     rte
  695.  
  696. *-------------------------------------------------------------------------*
  697.  
  698. EMPTY_BUFFER:
  699.     pushall
  700.     bsr.s        FLUSH        ; flush the IKBD properly (sorry, GEM!)
  701. .bak    push.w    #11
  702.     trap        #1
  703.     addq        #2,sp
  704.     tst.l        d0
  705.     beq.s        .out
  706.     push.w    #7
  707.     trap        #1
  708.     addq        #2,sp
  709.     bra.s        .bak
  710. .out    popall
  711.     rts
  712.  
  713. FLUSH:push.w    d7
  714. .read    btst        #0,$FFFFFC00.w    ; empty hardware ikbd buffer
  715.     beq.s        .out
  716.     move.b    $FFFFFC02.w,d7
  717.     bra.s        .read
  718. .out    pop.w        d7
  719.     rts
  720.  
  721. KILL_PALETTE:
  722.     moveq        #8-1,d7
  723.     lea        COLOUR.w,a0
  724. .lp    clr.l        (a0)+
  725.     dbra        d7,.lp        ; empty out palette
  726.     rts
  727.  
  728. CLS:    move.w    #32000/4-1,d0
  729. .loop    clr.l        (a0)+
  730.     dbra        d0,.loop
  731.     rts
  732.  
  733.         IFD        FORCE_FILENAME
  734. FILENAME:    dc.b        "F:\pcs\*.PCS",0
  735.         even
  736.         ELSEIF
  737. FILENAME:    ds.b        64
  738.         ENDC
  739.  
  740. DECRUNCH:    include    c:\packers\ice\ice_unpa.s
  741.  
  742. *-----------------------------------------------------------------------*
  743.     SECTION DATA
  744. *-----------------------------------------------------------------------*
  745.  
  746. TIME:            dc.w    500        ; number of seconds to display picture
  747.  
  748. PIC_PTR:        ds.l    1
  749. BANK_PTR:        ds.l    1
  750. PHYS_PALETTE:    ds.l    1        ; palette 1 address
  751. LOG_PALETTE:    ds.l    1        ; palette 2 address
  752. PHYS_BITMAP:    ds.l    1        ; screen 1 address
  753. LOG_BITMAP:        ds.l    1        ; screen 2 address
  754. HANDLE:        ds.w    1
  755.  
  756. *-----------------------------------------------------------------------*
  757.     SECTION BSS
  758. *-----------------------------------------------------------------------*
  759.  
  760. MODCOM:        ds.l    1
  761. OLD_SCR        ds.l    1
  762. TIMER:        ds.w    1
  763. OLD_PAL        ds.w    16
  764. OLD_RES:        ds.w    1
  765.  
  766. VECTORS:        ds.b    40
  767. INTERLACE:        ds.b    1
  768. HERZ:            ds.b    1
  769.             even
  770.  
  771. SCREEN1:        ds.b    32768
  772. SCREEN2:        ds.b    32768
  773. PALETTE1:        ds.w    (16*3*200)+16
  774. PALETTE2:        ds.w    (16*3*200)+16
  775.  
  776. space:        ds.b    102000
  777.  
  778.